import { initMixin } from './init'
import { stateMixin } from './state'
import { renderMixin } from './render'
import { eventsMixin } from './events'
import { lifecycleMixin } from './lifecycle'
import { warn } from '../util/index'

/**
 * Vue 实际上是一个类，Vue 只能通过 new 关键字初始化，然后调用 this._init 方法。
 * 本质就是一个用 Function 实现的 Class，然后在它的原型 prototype 以及它本身都扩展了一系列的方法和属性
 */
function Vue (options) {
  if (process.env.NODE_ENV !== 'production' &&
    !(this instanceof Vue)
  ) {
    warn('Vue is a constructor and should be called with the `new` keyword')
  }
  this._init(options)
}

/**
 * 往 Vue 的原型上挂载一些方法（_init）
 */
initMixin(Vue)
// 与数据相关
stateMixin(Vue)
// 与事件相关
eventsMixin(Vue)
// 生命周期
lifecycleMixin(Vue)
renderMixin(Vue)

export default Vue
